var fs = require('fs');
var config = require('../../../config.json');
var zip = require('../../../common/zip.js');
var path = require('path');
var _ = require('lodash');
var simpleGit = require('simple-git')(config.workspace.gitolite.gitolite_repo);
var logger = require('log4js').getLogger();
var readline = require('readline');
var waterfall = require('async-waterfall');
var removeDir = require('../../../common/removeDir.js');
var decompress = require('decompress');
var uuid = require('uuid');
var workspace_dirs = require('./dirs').workspace_dirs;
var request = require('request');

exports.cloneGitRepository = function (git_name, local_path, call_back) {
    cloneGit(git_name, local_path, "develop", function (err, data) {
        if (err) {
            logger.error(err);
            return call_back(err);
        }
        logger.info("clone项目成功");
        call_back(null, "done");
    });
};

//exports.createGitRepository = function (project_name, full_work_name, call_back) {
//    var repoPath = config.workspace.gitolite.repo_pre + project_name;
//    var localPath = path.join(config.workspace.workspeces_path,
//        full_work_name, workspace_dirs.Source, project_name);
//    var ignore_path = path.join(localPath, ".gitignore");
//    var git_server = "http://" + config.git_server.host + ":" + config.git_server.port + "/api/git/create";
//
//    waterfall([
//        //1.调用git-server创建git库
//        function (cb) {
//            request.post({
//                url: git_server,
//                form: {project_name: project_name}
//            }, function (err, req) {
//                if (err) {
//                    logger.error(err);
//                    logger.error("调用git服务出错");
//                    return call_back(err);
//                }
//                logger.error(res.body);
//                if (req.body.code == "500") {
//                    logger.error(res.msg);
//                    return call_back(res.msg);
//                }
//                logger.info("git服务创建git库成功");
//                cb(null);
//            });
//        },
//        //2.clone项目
//        function (cb) {
//            simpleGit.clone(repoPath, localPath, function (err, data) {
//                if (err) {
//                    logger.error(err);
//                    logger.error("clone项目失败");
//                    return call_back(err);
//                }
//                logger.info("clone项目成功");
//                cb(null);
//            });
//        },
//        function (cb) {
//            fs.writeFile(ignore_path, "*/jmx/*\r\n*.class", 'utf-8', function (err) {
//                if (err) {
//                    logger.error(err);
//                    logger.error("创建.gitignore文件出错");
//                    return call_back(err);
//                }
//                logger.info("创建.gitignore文件成功");
//                cb(null);
//            });
//        },
//        function (cb) {
//            require('simple-git')(localPath)
//                .add('./.gitignore')
//                .commit("first commit!")
//                .push('origin', 'master', function (err, data) {
//                    if (err) {
//                        logger.error(err);
//                        logger.error("推送.gitignore出错");
//                        return call_back(err);
//                    }
//                    logger.info("推送.gitignore成功");
//                }).checkoutLocalBranch('develop', function (err, result) {
//                if (err) {
//                    logger.error(err);
//                    logger.error("切换develop失败");
//                    return res.send(err);
//                }
//                logger.info("切换develop成功");
//            }).push('origin', 'develop', function (err, data) {
//                if (err) {
//                    logger.error(err);
//                    logger.error("推送develop分支出错");
//                    return res.send(err);
//                }
//                logger.info("推送develop成功");
//                cb(null, data);
//            });
//        }
//    ], function (err, result) {
//        if (err) {
//            logger.error(err);
//            return call_back("未知的异常，创建git库失败");
//        }
//        call_back(null, "done");
//    });
//}

/**
 * 删除项目对应的gitolite库
 * @param git_name
 * @param call_back
 */
exports.removeGit = function (git_name, call_back) {
    var git_server = "http://" + config.git_server.host + ":" + config.git_server.port + "/api/git/remove";
    //调用git-server创建git库
    request.post({
        url: git_server,
        form: {project_name: git_name}
    }, function (err, req) {
        if (err) {
            logger.error(err);
            logger.error("调用git服务出错");
            return call_back(err);
        }
        logger.info(req.body);
        if (req.body.code == "500") {
            logger.error(res.msg);
            return call_back(res.msg);
        }
        logger.info("git服务删除git库成功");
        call_back(null,"done");
    });
}

exports.checkGitUrl = function (req, res, next) {
    var repoPath = req.body.git_url;
    var git_source = req.body.git_source;
    if (git_source == "0") {
        return res.format_json(null, 200, "success");
    }
    if (!_.startsWith(repoPath, config.workspace.gitolite.repo_pre)) {
        return res.format_json(null, 401, "failed");
    }
    simpleGit.listRemote([repoPath], function (err, data) {
        if (err) {
            return res.format_json(null, 400, "failed");
        }
        return res.format_json(null, 200, "success");
    });
}
var cloneGit = function (git_name, localPath, branch, call_back) {
    var Repository = require('git-cli').Repository;
    var repoPath = config.workspace.gitolite.repo_pre + git_name;
    //repoPath = "git@123.56.190.188:TZJC";
    Repository.clone(repoPath, localPath, {branch: branch}, function (err, data) {
        if (err) {
            logger.error(err);
            logger.error("clone项目失败");
            return call_back(err);
        }
        console.log(data);
        call_back(null, data);
    });
};
exports.cloneGit = cloneGit;
exports.pullGit = function (path, remote, branch, call_back) {
    var simpleGit = require('simple-git')(path);
    simpleGit.pull(remote, branch, call_back);
}